package com.example.net;

import android.content.Context;

import com.example.net.config.NetworkConfig;
import com.example.net.interceptor.AppendHeaderInterceptor;
import com.example.net.interceptor.AppendUrlInterceptor;
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import java.io.File;
import java.util.concurrent.TimeUnit;

import okhttp3.Cache;
import okhttp3.OkHttpClient;
import okhttp3.logging.HttpLoggingInterceptor;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

/**
 * 创建者     ZCL
 * 创建时间   2018/3/22 14:38
 * 描述	      ${通过这个类获取retrofit实例对象 最终为了拿到Okhtttp单例对象}
 * <p>
 * 更新者     $Author$
 * 更新时间   $Date$
 * 更新描述   ${TODO}
 */

public class RetrofitManger {
    private static Context mContext;
    OkHttpClient mClient = null;
    // private static RetrofitManger mInstance;
    /*public static RetrofitManger getInstaManger(Context context){
        if(mInstance==null)
                mInstance =new RetrofitManger();
            return mInstance;
    }*/

    private static class InnerManger {
        private static RetrofitManger mInstance = new RetrofitManger();
    }

    public static void init(Context context){
        mContext = context.getApplicationContext();//防止内存泄漏
    }
    /**
     * 提供retrofitManger单例对象
     * @return
     */
    public static RetrofitManger getRetrofitInstnce(){
        return InnerManger.mInstance;
    }

    /**
     * 获取retrofit实例对象
     */
    public Retrofit netRetrofit(String url){

        return new Retrofit.Builder()
                    .baseUrl(url)
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    /**
                     * 一旦封装了basebean一定不能使用consum否则会闪退暂时不知为什么
                     * 两个解析库只能使用一个  使用自己的话只能点击剥离后的按钮
                     */
                    //引入Gson解析库就可以直接以实体拿到返回值,因为他这是最终泪所以我们只能copy GsonConverterFactory过来自己定义
                    .addConverterFactory(GsonConverterFactory.create())
                    //传入我们自定义的gson解析库
                    //.addConverterFactory(GstGsonConverterFactory.create())
                    //关联拦截器
                    .client(mClient)
                    .build();

    }


    /**
     * 添加引用
     */
    private RetrofitManger() {
        //创建okhtttpBuilder
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        //创建拦截器
        HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor()
                .setLevel(HttpLoggingInterceptor.Level.BODY);


        //缓存设置
        File cadnCache = new File(mContext.getExternalCacheDir(), "cadn_cache");
        Cache cache = new Cache(cadnCache, 1021 * 1024 * 100);

        //添加缓存和拦截器
        builder.cache(cache)
                //如果使用缓存上传功能就不能使用否则报错504 Unsatisfiable Request 因为上传文件没有东西需要缓存
                //.addInterceptor(new CacheNoNetIntercepter())
                //如果没有网络我们就直接给截断请求 所以这个拦截器必须在第一位  如果设置了这个那么上面缓存就没用或者可以合并一起
                //.addInterceptor(new PreHandleNoNetInterceptor())
                //url自动追加参数
                .addInterceptor(new AppendUrlInterceptor())
                //header 自动追加参数
                .addInterceptor(new AppendHeaderInterceptor())
                //body 自动追加参数  将url参数->body
                //.addInterceptor(new AppendBodyIntercepter())
                .connectTimeout(60000, TimeUnit.MILLISECONDS)//超时时间60000毫秒
                .readTimeout(60, TimeUnit.SECONDS)//超时时间60s
                .writeTimeout(1, TimeUnit.MINUTES)//超时时间1分
                .retryOnConnectionFailure(true);//错误重连


        //添加logging拦截器
        if (NetworkConfig.isDebug) {
            mClient = builder.addInterceptor(loggingInterceptor).build();
        } else {
            mClient = builder.build();
        }

    }

}
